package bibliotheque.wave;

import java.io.Serializable;

/**
 * Cette classe contient toute les informations qui doivent circuler avec la vague, notamment le WaveId comme on l'a vu. Elle offre 5 methodes qui peuvent etre surchargees par les classes qui en herite pour definir un comportement particulier pour une vague.
 * Le WaveAgent garanti que chacune de ces methodes est appele une seule fois sur chaque WaveAgent (ormis Acknowledge), dans l'ordre, et en exclusion mutuelle.
 */
public abstract class WaveAction implements Serializable {
    
    /**
     *L'identifiant de la vague.
     */
    public WaveId wave_id;
    
    /**
     * PropagateBefore est execute lorsqu'un WaveAgent recoit une vague pour la premiere fois, et avant qu'il la propage. La propagation de la vague est bloque sur ce WaveAgent pendant le traitement de cette methode, qui peut modifier les donnees du WaveAction qui seront transmise lorsque la propagation reprendra.
     * @param agent Le waveAgent sur lequel doit agir la methode.
     * @throws java.lang.Exception Exception qui sera traiter comme une WaveError par le WaveAgent.
     */
    public void PropagateBefore(WaveAgent agent) throws Exception {
        
    }
    
    /**
     * Cette methode est execute lorsqu'un WaveAgent recoit une vague pour la premiere fois, et juste apres l'avoir propage. Un traitement peut donc etre effectuer en tache de fond pendant que la vague continue de se propager. Un mutex (declare dans la classe Wave) permet d'empeche un vague de traiter des acquitement tant que cette methode n'est pas termine.
     * @param agent Le waveAgent sur lequel doit agir la methode.
     * @throws java.lang.Exception Exception qui sera traiter comme une WaveError par le WaveAgent.
     */
    public void PropagateAfter(WaveAgent agent) throws Exception {
        
    }
    
    /**
     * Cette methode est execute lorsqu'un WaveAgent recoit un acquitement. Elle peut par exemple sauvegarder, sur le WaveAgent, les resultats contenus dans le WaveAction pour que celui-ci puisse traiter ces resultat lorsqu'il aura recu tout les acquitements pour cette vague.
     * @param agent Le waveAgent sur lequel doit agir la methode.
     * @throws java.lang.Exception Exception qui sera traiter comme une WaveError par le WaveAgent.
     */
    public void Acknowledge(WaveAgent agent) throws Exception {
        
    }
    
    /**
     * Cette methode est execute lorsqu'un WaveAgent recoit le dernier acquitement de ses voisins, et avant qu'il acquite lui-meme la vague. Elle peut par exemple synthetiser les resultat des different acquitement et mettre les resultats dans le WaveAction pour qu'ils soit envoyes avec l'acquitement.
     * @param agent Le waveAgent sur lequel doit agir la methode.
     * @throws java.lang.Exception Exception qui sera traiter comme une WaveError par le WaveAgent.
     */
    public void LocalEnd (WaveAgent agent) throws Exception {
        
    }
    
    /**
     * Cette methode defini le traitement a executer lorsque la vague est terminee.
     * @param agent Le waveAgent sur lequel doit agir la methode.
     * @throws java.lang.Exception Exception qui sera traiter comme une WaveError par le WaveAgent.
     */
    public void GlobalEnd(WaveAgent agent) throws Exception {
        
    }
    
}
